<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>ES6类继承的复习</title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="">
</head>

<body>
  
    <script>

       //class声明类 
        //constructor 定义构造函数初始化，
        //extends继承父类
        //super 调用父级构造方法
        //static 定义静态方法和属性、
        //父类方法可以重写、


      /*
       总结:1.类的构造器不是必须写的，要对实例进行一些初始化的操作，如添加指定属性时才写
            2.如果A类继承了B类，且A类中写了构造器，那么A类构造器中的super是必须调用的
            3.类中所有定义的方法，都是放在了类的原型对象上，供实例去使用
      
      
      */

      //父类
      class Person {
          //constructor构造函数（构造方法）初始化
          constructor(a,b) {
            //this:类的实例对象，谁传的参数，this是谁，
            this.name =a
            this.age =b
          }

          //一般的方法:类的所有方法都定义在类的原型（prototype）上面
          //原型对象上的方法this默认指向类的实例
          deng(){
              //deng中的this是Person实例（p,p1）,谁调用是谁
             return console.log(`我是${this.name}我今年${this.age}`)
          }
      }


     //子类 Student继承 父类Person
      class Student extends Person {
            constructor(a,b,c) {
            //this:类的实例对象，谁传的参数，this是谁，
            super(a,b) // super必须放在所有子类初始化数据之前
            this.dizhi =c
          }
          //当子类继承了父类，如果const S =new Student("魏卫浩","30")传的实参 和父类的(a,b)形参，数量一致，则，子类可以不写constructor(),直接继承父类的初始化构造方法，  

          //当子类继承了父类，子类上有自己独有的属性时，如（const S =new Student("魏卫浩","30","西安") 多出了实参:西安，
          //那么子类需要重写constructor（）初始化构造方法，在子类constructor（）初始化构造方法中，必须调用super(调用父级构造方法)，把子类和父类相等的形参个数，还是传给父类处理
          //子类转的3个参数（a,b,c），两个(a,b)调用super还是交个父类的 constructor初始化，而子类的 constructor其实只初始化了参数c



          //子类上多出来的c ，当子类使用C时，需要重写 deng()方法
          deng(){
            //这块的deng()在 Student的原型上放着，
            //通过Student实例调用deng时，deng中的this就是Student实例（S）
             return console.log(`我是${this.name}我今年${this.age}，我家在${this.dizhi}`)
          }

      } 

     const S =new Student("魏卫浩","30","西安"); 
     console.log(S)

     console.log(S.deng())



      //实力化对象
      const p =new Person('邓紫棋','30');
      const p1 =new Person('周杰伦','42');
    //   console.log(p) //实例对象
    //   console.log(p.__proto__.deng)
     p.deng()
     p1.deng()

    </script>

   



</body>

</html>